package jmine.tec.di.wrapper;

import java.util.List;

import jmine.tec.utils.Tuple;

/**
 * Wrappers para colecoes, etc
 * 
 * @author MarceloT
 */
public interface Wrapper {

    /**
     * Devolve <code>true</code> se este wrapper vai agrupar colecoes
     * 
     * @return boolean
     */
    boolean isManyWrapper();

    /**
     * Wrapps o valor
     * 
     * @param propertyKey String
     * @param propertyValues Object
     * @param valueType Type
     * @return {@link Object}
     */
    Object wrap(Object propertyKey, Object propertyValues, Class<?> valueType);

    /**
     * Wrapp varios valores
     * 
     * @param propertyKeys os nomes das propriedades
     * @param propertyValues os valores das propriedades
     * @param valueType o tipo de valor
     * @return Object
     */
    Object wrap(Object[] propertyKeys, Object[] propertyValues, Class<?> valueType);

    /**
     * Verifica se o tipo deste wrapper é compativel com o tipo de container passado
     * 
     * @param containerType Class
     * @return boolean
     */
    boolean isTypeCompatible(Class<?> containerType);

    /**
     * Verifica se o conteudo do objeto passado eh compativel com o requiredComponentClass. O motivo deste metodo ficar aqui e nao na classe
     * cliente eh que as classes clientes nao conhecem (e nem devem) o tipo da colecao ou wrapper
     * 
     * @param resolved Object
     * @param requiredComponentClass Class
     * @return boolean
     */
    boolean checkContainedType(Object resolved, Class<?> requiredComponentClass);

    /**
     * Coleta o conteudo do wrapper passado
     * 
     * @param resolved Object
     * @param name String
     * @return List de Tuple
     */
    List<Tuple<?, ?>> collect(Object resolved, String name);
}
